package org.yelongframework.zip;

import org.apache.commons.lang3.StringUtils;
import org.yelongframework.lang.Nullable;

/**
 * 压缩文件项
 * 
 * @since 1.0.0
 */
public class ZipFileEntry {

	/** 文件类型：文件夹 */
	public static final int FILE_TYPE_DIRECTORY = 0;

	/** 文件类型：文件 */
	public static final int FILE_TYPE_FILE = 1;

	/** 空的数据供应商 */
	public static final ZipFileEntryDataSupplier NULL_DATA_SUPPLIER = () -> null;

	/** 在压缩包内的文件名称（文件全路径，可以通过文件分隔符进行分割） */
	private final String name;

	/** 数据供应商 */
	private final ZipFileEntryDataSupplier dataSupplier;

	/** 文件类型，默认是文件 */
	private int fileType = FILE_TYPE_FILE;

	/**
	 * @param name 在压缩包内的文件名称（文件全路径，可以通过文件分隔符进行分割）
	 */
	public ZipFileEntry(String name) {
		this(name, null);
	}

	/**
	 * @param name         在压缩包内的文件名称（文件全路径，可以通过文件分隔符进行分割）
	 * @param dataSupplier 数据供应商
	 */
	public ZipFileEntry(String name, @Nullable ZipFileEntryDataSupplier dataSupplier) {
		if (StringUtils.isBlank(name)) {
			throw new IllegalArgumentException("name cannot be blank");
		}
		this.name = name;
		this.dataSupplier = null != dataSupplier ? dataSupplier : NULL_DATA_SUPPLIER;
	}

	/**
	 * 设置文件类型为文件
	 * 
	 * @return this
	 */
	public ZipFileEntry setFileTypeFile() {
		this.fileType = FILE_TYPE_FILE;
		return this;
	}

	/**
	 * 设置文件类型为文件夹
	 * 
	 * @return this
	 */
	public ZipFileEntry setFileTypeDirectory() {
		this.fileType = FILE_TYPE_DIRECTORY;
		return this;
	}

	/**
	 * 该压缩文件项是否是一个文件
	 * 
	 * @return <code>true</code> 该压缩文件项是一个文件
	 */
	public boolean isFile() {
		return fileType == FILE_TYPE_FILE;
	}

	/**
	 * 该压缩文件项是否是一个文件夹
	 * 
	 * @return <code>true</code> 该压缩文件项是一个文件夹
	 */
	public boolean isDirectory() {
		return fileType == FILE_TYPE_DIRECTORY;
	}

	/**
	 * @return 在压缩包内的文件名称（文件全路径，可以通过文件分隔符进行分割）
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return 数据供应商
	 */
	public ZipFileEntryDataSupplier getDataSupplier() {
		return dataSupplier;
	}

}
